package BloodTimeHybernateDO;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.hibernate.annotations.Proxy;

import dao.api.DataObject;

/**
 * 
 * @author Eduardo D. Sandoval V.
 * 
 */
@Entity
@Table(name = "ciudad")
@Proxy(lazy = false)
public class CiudadDO implements DataObject {

	// -------------------------------
	// Identificador auto-incremental
	// -------------------------------

	private int id;

	// -------------------
	// Datos de la Ciudad
	// -------------------

	private String nombre;
	private String descripcion;
	private byte[] imagen;
	private int ptosRequeridos;

	// ------------
	// Referencias
	// ------------

	private List<VampiroDO> vampiroList = //
	new ArrayList<VampiroDO>();

	private List<PropiedadVampiroDO> propiedadVampiroList = //
	new ArrayList<PropiedadVampiroDO>();

	private List<CiudadDistanciaDO> ciudadDistanciaDerList = //
	new ArrayList<CiudadDistanciaDO>();

	private List<CiudadDistanciaDO> ciudadDistanciaIzqList = //
	new ArrayList<CiudadDistanciaDO>();

	private List<CiudadArticuloDO> ciudadArticuloList = //
	new ArrayList<CiudadArticuloDO>();

	private List<VisitaDO> visitaList = //
	new ArrayList<VisitaDO>();

	// ---------------------------------------------------------------------------------------------------------------------------------------

	public CiudadDO() {
		// Empty
	}

	@Override
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE ,generator="ciudad_sequence")
	@SequenceGenerator(sequenceName = "ciudad_sequence", name = "ciudad_sequence", allocationSize = 1)
	public int getId() {
		return id;
	}

	@Override
	public void setId(int id) {
		this.id = id;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public byte[] getImagen() {
		return imagen;
	}

	public void setImagen(byte[] imagen) {
		this.imagen = imagen;
	}

	public int getPtosRequeridos() {
		return ptosRequeridos;
	}

	public void setPtosRequeridos(int ptosRequeridos) {
		this.ptosRequeridos = ptosRequeridos;
	}

	@OneToMany(mappedBy = "ciudadId")
	@LazyCollection(LazyCollectionOption.FALSE)
	@Cascade( { CascadeType.ALL, CascadeType.DELETE_ORPHAN })
	public List<VampiroDO> getVampiroList() {
		return vampiroList;
	}

	public void setVampiroList(List<VampiroDO> vampiroList) {
		this.vampiroList = vampiroList;
	}

	@OneToMany(mappedBy = "ciudadId")
	@LazyCollection(LazyCollectionOption.FALSE)
	@Cascade( { CascadeType.ALL, CascadeType.DELETE_ORPHAN })
	public List<PropiedadVampiroDO> getPropiedadVampiroList() {
		return propiedadVampiroList;
	}

	public void setPropiedadVampiroList(
			List<PropiedadVampiroDO> propiedadVampiroList) {
		this.propiedadVampiroList = propiedadVampiroList;
	}

	@OneToMany(mappedBy = "ciudadDerId")
	@LazyCollection(LazyCollectionOption.FALSE)
	@Cascade( { CascadeType.ALL, CascadeType.DELETE_ORPHAN })
	public List<CiudadDistanciaDO> getCiudadDistanciaDerList() {
		return ciudadDistanciaDerList;
	}

	public void setCiudadDistanciaDerList(
			List<CiudadDistanciaDO> ciudadDistanciaDerList) {
		this.ciudadDistanciaDerList = ciudadDistanciaDerList;
	}

	@OneToMany(mappedBy = "ciudadIzqId")
	@LazyCollection(LazyCollectionOption.FALSE)
	@Cascade( { CascadeType.ALL, CascadeType.DELETE_ORPHAN })
	public List<CiudadDistanciaDO> getCiudadDistanciaIzqList() {
		return ciudadDistanciaIzqList;
	}

	public void setCiudadDistanciaIzqList(
			List<CiudadDistanciaDO> ciudadDistanciaIzqList) {
		this.ciudadDistanciaIzqList = ciudadDistanciaIzqList;
	}

	@OneToMany(mappedBy = "ciudadId")
	@LazyCollection(LazyCollectionOption.FALSE)
	@Cascade( { CascadeType.ALL, CascadeType.DELETE_ORPHAN })
	public List<CiudadArticuloDO> getCiudadArticuloList() {
		return ciudadArticuloList;
	}

	public void setCiudadArticuloList(List<CiudadArticuloDO> ciudadArticuloList) {
		this.ciudadArticuloList = ciudadArticuloList;
	}

	@OneToMany(mappedBy = "ciudadId")
	@LazyCollection(LazyCollectionOption.FALSE)
	@Cascade( { CascadeType.ALL, CascadeType.DELETE_ORPHAN })
	public List<VisitaDO> getVisitaList() {
		return visitaList;
	}

	public void setVisitaList(List<VisitaDO> visitaList) {
		this.visitaList = visitaList;
	}

}
